<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/bit_spinlock.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/bit_spinlock.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="Maybe">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_X19MSU5VWF9CSVRfU1BJTkxPQ0tfSF8w"><span class="b">__LINUX_BIT_SPINLOCK_H</span></a>
<a name="2" /><span class="Maybe">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19MSU5VWF9CSVRfU1BJTkxPQ0tfSF8w"><span class="b">__LINUX_BIT_SPINLOCK_H</span></a>
<a name="3" /><span class="Maybe">       3:</span> 
<a name="4" /><span class="Maybe">       4:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">kernel</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="5" /><span class="Maybe">       5:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">preempt</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="6" /><span class="Maybe">       6:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">atomic</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="7" /><span class="Maybe">       7:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">bug</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="8" /><span class="Maybe">       8:</span> 
<a name="9" /><span class="Maybe">       9:</span> <span class="k">/*</span>
<a name="10" /><span class="Maybe">      10:</span> <span class="k"> *  bit-based spin_lock()</span>
<a name="11" /><span class="Maybe">      11:</span> <span class="k"> *</span>
<a name="12" /><span class="Maybe">      12:</span> <span class="k"> * Don&apos;t use this unless you really need to: spin_lock() and spin_unlock()</span>
<a name="13" /><span class="Maybe">      13:</span> <span class="k"> * are significantly faster.</span>
<a name="14" /><span class="Maybe">      14:</span> <span class="k"> */</span>
<a name="15" /><span class="Maybe">      15:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">bit_spin_lock</span><span class="f">(</span><span class="m">int</span> <span class="b">bitnum</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="f">*</span><span class="b">addr</span><span class="f">)</span>
<a name="16" /><span class="Maybe">      16:</span> <span class="f">{</span>
<a name="17" /><span class="Maybe">      17:</span>     <span class="k">/*</span>
<a name="18" /><span class="Maybe">      18:</span> <span class="k">     * Assuming the lock is uncontended, this never enters</span>
<a name="19" /><span class="Maybe">      19:</span> <span class="k">     * the body of the outer loop. If it is contended, then</span>
<a name="20" /><span class="Maybe">      20:</span> <span class="k">     * within the inner loop a non-atomic test is used to</span>
<a name="21" /><span class="Maybe">      21:</span> <span class="k">     * busywait with less bus contention for a good time to</span>
<a name="22" /><span class="Maybe">      22:</span> <span class="k">     * attempt to acquire the lock bit.</span>
<a name="23" /><span class="Maybe">      23:</span> <span class="k">     */</span>
<a name="24" /><span class="Maybe">      24:</span>     <a href="cpu.c_macros_ref.html#_cHJlZW1wdF9kaXNhYmxlXzA_"><span class="b">preempt_disable</span></a><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="25" /><span class="Maybe">      25:</span> <span class="f">#</span><span class="n">if</span> <span class="b">defined</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_Q09ORklHX1NNUF8w"><span class="b">CONFIG_SMP</span></a><span class="f">)</span> <span class="f">||</span> <span class="b">defined</span><span class="f">(</span><span class="b">CONFIG_DEBUG_SPINLOCK</span><span class="f">)</span>
<a name="26" /><span class="Maybe">      26:</span>     <span class="m">while</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_dW5saWtlbHlfMA__"><span class="b">unlikely</span></a><span class="f">(</span><span class="b">test_and_set_bit_lock</span><span class="f">(</span><span class="b">bitnum</span><span class="f">,</span> <span class="b">addr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span> <span class="f">{</span>
<a name="27" /><span class="Maybe">      27:</span>         <a href="cpu.c_macros_ref.html#_cHJlZW1wdF9lbmFibGVfMA__"><span class="b">preempt_enable</span></a><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="28" /><span class="Maybe">      28:</span>         <span class="m">do</span> <span class="f">{</span>
<a name="29" /><span class="Maybe">      29:</span>             <span class="b">cpu_relax</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="30" /><span class="Maybe">      30:</span>         <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_dGVzdF9iaXRfMA__"><span class="b">test_bit</span></a><span class="f">(</span><span class="b">bitnum</span><span class="f">,</span> <span class="b">addr</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="31" /><span class="Maybe">      31:</span>         <a href="cpu.c_macros_ref.html#_cHJlZW1wdF9kaXNhYmxlXzA_"><span class="b">preempt_disable</span></a><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="32" /><span class="Maybe">      32:</span>     <span class="f">}</span>
<a name="33" /><span class="Maybe">      33:</span> <span class="f">#</span><span class="n">endif</span>
<a name="34" /><span class="Maybe">      34:</span>     <a href="cpu.c_macros_ref.html#_X19hY3F1aXJlXzA_"><span class="b">__acquire</span></a><span class="f">(</span><span class="b">bitlock</span><span class="f">)</span><span class="f">;</span>
<a name="35" /><span class="Maybe">      35:</span> <span class="f">}</span>
<a name="36" /><span class="Maybe">      36:</span> 
<a name="37" /><span class="Maybe">      37:</span> <span class="k">/*</span>
<a name="38" /><span class="Maybe">      38:</span> <span class="k"> * Return true if it was acquired</span>
<a name="39" /><span class="Maybe">      39:</span> <span class="k"> */</span>
<a name="40" /><span class="Maybe">      40:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">bit_spin_trylock</span><span class="f">(</span><span class="m">int</span> <span class="b">bitnum</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="f">*</span><span class="b">addr</span><span class="f">)</span>
<a name="41" /><span class="Maybe">      41:</span> <span class="f">{</span>
<a name="42" /><span class="Maybe">      42:</span>     <a href="cpu.c_macros_ref.html#_cHJlZW1wdF9kaXNhYmxlXzA_"><span class="b">preempt_disable</span></a><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="43" /><span class="Maybe">      43:</span> <span class="f">#</span><span class="n">if</span> <span class="b">defined</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_Q09ORklHX1NNUF8w"><span class="b">CONFIG_SMP</span></a><span class="f">)</span> <span class="f">||</span> <span class="b">defined</span><span class="f">(</span><span class="b">CONFIG_DEBUG_SPINLOCK</span><span class="f">)</span>
<a name="44" /><span class="Maybe">      44:</span>     <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_dW5saWtlbHlfMA__"><span class="b">unlikely</span></a><span class="f">(</span><span class="b">test_and_set_bit_lock</span><span class="f">(</span><span class="b">bitnum</span><span class="f">,</span> <span class="b">addr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span> <span class="f">{</span>
<a name="45" /><span class="Maybe">      45:</span>         <a href="cpu.c_macros_ref.html#_cHJlZW1wdF9lbmFibGVfMA__"><span class="b">preempt_enable</span></a><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="46" /><span class="Maybe">      46:</span>         <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="47" /><span class="Maybe">      47:</span>     <span class="f">}</span>
<a name="48" /><span class="Maybe">      48:</span> <span class="f">#</span><span class="n">endif</span>
<a name="49" /><span class="Maybe">      49:</span>     <a href="cpu.c_macros_ref.html#_X19hY3F1aXJlXzA_"><span class="b">__acquire</span></a><span class="f">(</span><span class="b">bitlock</span><span class="f">)</span><span class="f">;</span>
<a name="50" /><span class="Maybe">      50:</span>     <span class="m">return</span> <span class="c">1</span><span class="f">;</span>
<a name="51" /><span class="Maybe">      51:</span> <span class="f">}</span>
<a name="52" /><span class="Maybe">      52:</span> 
<a name="53" /><span class="Maybe">      53:</span> <span class="k">/*</span>
<a name="54" /><span class="Maybe">      54:</span> <span class="k"> *  bit-based spin_unlock()</span>
<a name="55" /><span class="Maybe">      55:</span> <span class="k"> */</span>
<a name="56" /><span class="Maybe">      56:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">bit_spin_unlock</span><span class="f">(</span><span class="m">int</span> <span class="b">bitnum</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="f">*</span><span class="b">addr</span><span class="f">)</span>
<a name="57" /><span class="Maybe">      57:</span> <span class="f">{</span>
<a name="58" /><span class="False">      58:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_DEBUG_SPINLOCK</span>
<a name="59" /><span class="False">      59:</span>     <a href="cpu.c_macros_ref.html#_QlVHX09OXzA_"><span class="b">BUG_ON</span></a><span class="f">(</span><span class="f">!</span><a href="cpu.c_macros_ref.html#_dGVzdF9iaXRfMA__"><span class="b">test_bit</span></a><span class="f">(</span><span class="b">bitnum</span><span class="f">,</span> <span class="b">addr</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="60" /><span class="Maybe">      60:</span> <span class="f">#</span><span class="n">endif</span>
<a name="61" /><span class="Maybe">      61:</span> <span class="f">#</span><span class="n">if</span> <span class="b">defined</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_Q09ORklHX1NNUF8w"><span class="b">CONFIG_SMP</span></a><span class="f">)</span> <span class="f">||</span> <span class="b">defined</span><span class="f">(</span><span class="b">CONFIG_DEBUG_SPINLOCK</span><span class="f">)</span>
<a name="62" /><span class="Maybe">      62:</span>     <span class="b">clear_bit_unlock</span><span class="f">(</span><span class="b">bitnum</span><span class="f">,</span> <span class="b">addr</span><span class="f">)</span><span class="f">;</span>
<a name="63" /><span class="Maybe">      63:</span> <span class="f">#</span><span class="n">endif</span>
<a name="64" /><span class="Maybe">      64:</span>     <a href="cpu.c_macros_ref.html#_cHJlZW1wdF9lbmFibGVfMA__"><span class="b">preempt_enable</span></a><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="65" /><span class="Maybe">      65:</span>     <a href="cpu.c_macros_ref.html#_X19yZWxlYXNlXzA_"><span class="b">__release</span></a><span class="f">(</span><span class="b">bitlock</span><span class="f">)</span><span class="f">;</span>
<a name="66" /><span class="Maybe">      66:</span> <span class="f">}</span>
<a name="67" /><span class="Maybe">      67:</span> 
<a name="68" /><span class="Maybe">      68:</span> <span class="k">/*</span>
<a name="69" /><span class="Maybe">      69:</span> <span class="k"> *  bit-based spin_unlock()</span>
<a name="70" /><span class="Maybe">      70:</span> <span class="k"> *  non-atomic version, which can be used eg. if the bit lock itself is</span>
<a name="71" /><span class="Maybe">      71:</span> <span class="k"> *  protecting the rest of the flags in the word.</span>
<a name="72" /><span class="Maybe">      72:</span> <span class="k"> */</span>
<a name="73" /><span class="Maybe">      73:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">__bit_spin_unlock</span><span class="f">(</span><span class="m">int</span> <span class="b">bitnum</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="f">*</span><span class="b">addr</span><span class="f">)</span>
<a name="74" /><span class="Maybe">      74:</span> <span class="f">{</span>
<a name="75" /><span class="False">      75:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_DEBUG_SPINLOCK</span>
<a name="76" /><span class="False">      76:</span>     <a href="cpu.c_macros_ref.html#_QlVHX09OXzA_"><span class="b">BUG_ON</span></a><span class="f">(</span><span class="f">!</span><a href="cpu.c_macros_ref.html#_dGVzdF9iaXRfMA__"><span class="b">test_bit</span></a><span class="f">(</span><span class="b">bitnum</span><span class="f">,</span> <span class="b">addr</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="77" /><span class="Maybe">      77:</span> <span class="f">#</span><span class="n">endif</span>
<a name="78" /><span class="Maybe">      78:</span> <span class="f">#</span><span class="n">if</span> <span class="b">defined</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_Q09ORklHX1NNUF8w"><span class="b">CONFIG_SMP</span></a><span class="f">)</span> <span class="f">||</span> <span class="b">defined</span><span class="f">(</span><span class="b">CONFIG_DEBUG_SPINLOCK</span><span class="f">)</span>
<a name="79" /><span class="Maybe">      79:</span>     <span class="b">__clear_bit_unlock</span><span class="f">(</span><span class="b">bitnum</span><span class="f">,</span> <span class="b">addr</span><span class="f">)</span><span class="f">;</span>
<a name="80" /><span class="Maybe">      80:</span> <span class="f">#</span><span class="n">endif</span>
<a name="81" /><span class="Maybe">      81:</span>     <a href="cpu.c_macros_ref.html#_cHJlZW1wdF9lbmFibGVfMA__"><span class="b">preempt_enable</span></a><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="82" /><span class="Maybe">      82:</span>     <a href="cpu.c_macros_ref.html#_X19yZWxlYXNlXzA_"><span class="b">__release</span></a><span class="f">(</span><span class="b">bitlock</span><span class="f">)</span><span class="f">;</span>
<a name="83" /><span class="Maybe">      83:</span> <span class="f">}</span>
<a name="84" /><span class="Maybe">      84:</span> 
<a name="85" /><span class="Maybe">      85:</span> <span class="k">/*</span>
<a name="86" /><span class="Maybe">      86:</span> <span class="k"> * Return true if the lock is held.</span>
<a name="87" /><span class="Maybe">      87:</span> <span class="k"> */</span>
<a name="88" /><span class="Maybe">      88:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">bit_spin_is_locked</span><span class="f">(</span><span class="m">int</span> <span class="b">bitnum</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="f">*</span><span class="b">addr</span><span class="f">)</span>
<a name="89" /><span class="Maybe">      89:</span> <span class="f">{</span>
<a name="90" /><span class="Maybe">      90:</span> <span class="f">#</span><span class="n">if</span> <span class="b">defined</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_Q09ORklHX1NNUF8w"><span class="b">CONFIG_SMP</span></a><span class="f">)</span> <span class="f">||</span> <span class="b">defined</span><span class="f">(</span><span class="b">CONFIG_DEBUG_SPINLOCK</span><span class="f">)</span>
<a name="91" /><span class="Maybe">      91:</span>     <span class="m">return</span> <a href="cpu.c_macros_ref.html#_dGVzdF9iaXRfMA__"><span class="b">test_bit</span></a><span class="f">(</span><span class="b">bitnum</span><span class="f">,</span> <span class="b">addr</span><span class="f">)</span><span class="f">;</span>
<a name="92" /><span class="False">      92:</span> <span class="f">#</span><span class="n">elif</span> <span class="b">defined</span> <span class="b">CONFIG_PREEMPT_COUNT</span>
<a name="93" /><span class="False">      93:</span>     <span class="m">return</span> <span class="b">preempt_count</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="94" /><span class="False">      94:</span> <span class="f">#</span><span class="n">else</span>
<a name="95" /><span class="False">      95:</span>     <span class="m">return</span> <span class="c">1</span><span class="f">;</span>
<a name="96" /><span class="Maybe">      96:</span> <span class="f">#</span><span class="n">endif</span>
<a name="97" /><span class="Maybe">      97:</span> <span class="f">}</span>
<a name="98" /><span class="Maybe">      98:</span> 
<a name="99" /><span class="True">      99:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* __LINUX_BIT_SPINLOCK_H */</span>
<a name="100" /><span class="True">     100:</span> 
<a name="101" /><span class="True">     101:</span> </pre>
  </body>
</html>
